<?php
// vim: set ts=4 sw=4 sts=4 et:

/**
 * PHP version 5.3.0
 *
 * @category  allyoung
 * @author    ____author____
 * @copyright ____copyright____
 * @license   ____license____
 * @version   GIT: $Id:
 * @link      http://www.vmrf.ru/
 * @see       ____file_see____
 * @since     1.0.0
 */

namespace AY\Core;

/**
 * Quick access class
 *
 * @see   ____class_see____
 * @since 1.0.0
 */
class Region extends \AY\Base\Singleton
{
    /**
     * List of region
     *
     * @var   array
     * @see   ____var_see____
     * @since 1.0.0
     */
    //FIPS 10-4 Subcountry codes
    public $fips = array(
'01'=> 1,//"Adygeya Republic of"
'02'=> 3,//"Aginsky Buryatsky AO"
'03'=> 4,//"Gorno-Altay"
'04'=> 4,//"Altaisky krai"
'05'=> 28,//"Amur"
'06'=> 29,//"Arkhangel'sk"
'07'=> 30,//"Astrakhan'"
'08'=> 2,//"Bashkortostan"
'09'=> 31,//"Belgorod"
'10'=> 32,//"Bryansk"
'11'=> 3,//"Buryat"
'12'=> 20,//"Chechnya"
'13'=> 74,//"Chelyabinsk"
'14'=> 75,//"Chita"
'15'=> 87,//"Chukot"
'16'=> 21,//"Chuvashia"
'17'=> 5,//"Dagestan"
'18'=> 88,//"Evenk"
'19'=> 6,//"Ingush"
'20'=> 38,//"Irkutsk"
'21'=> 37,//"Ivanovo"
'22'=> 7,//"Kabardin-Balkar"
'23'=> 39,//"Kaliningrad"
'24'=> 8,//"Kalmyk"
'25'=> 40,//"Kaluga"
'26'=> 41,//"Kamchatka"
'27'=> 9,//"Karachay-Cherkess"
'28'=> 10,//"Karelia"
'29'=> 42,//"Kemerovo"
'30'=> 27,//"Khabarovsk"
'31'=> 19,//"Khakass"
'32'=> 86,//"Khanty-Mansiy"
'33'=> 43,//"Kirov"
'34'=> 81,//"Komi"
'35'=> 81,//"Komi-Permyak"
'36'=> 82,//"Koryak"
'37'=> 44,//"Kostroma"
'38'=> 23,//"Krasnodar"
'39'=> 24,//"Krasnoyarsk"
'40'=> 45,//"Kurgan"
'41'=> 46,//"Kursk"
'42'=> 47,//"Leningrad"
'43'=> 48,//"Lipetsk"
'44'=> 49,//"Magadan"
'45'=> 12,//"Mariy-El"
'46'=> 13,//"Mordovia"
'47'=> 77,//"Moskva"
'48'=> 77,//"Moscow City"
'49'=> 51,//"Murmansk"
'50'=> 89,//"Nenets"
'51'=> 52,//"Nizhegorod"
'52'=> 53,//"Novgorod"
'53'=> 54,//"Novosibirsk"
'54'=> 55,//"Omsk"
'55'=> 56,//"Orenburg"
'56'=> 57,//"Orel"
'57'=> 58,//"Penza"
'58'=> 59,//"Perm'"
'59'=> 25,//"Primor'ye"
'60'=> 60,//"Pskov"
'61'=> 61,//"Rostov"
'62'=> 62,//"Ryazan'"
'63'=> 14,//"Sakha"
'64'=> 65,//"Sakhalin"
'65'=> 63,//"Samara"
'66'=> 78,//"Saint Petersburg City"
'67'=> 64,//"Saratov"
'68'=> 15,//"North Ossetia"
'69'=> 67,//"Smolensk"
'70'=> 26,//"Stavropol'"
'71'=> 66,//"Sverdlovsk"
'72'=> 68,//"Tambovskaya oblast"
'73'=> 16,//"Tatarstan"
'74'=> 84,//"Taymyr"
'75'=> 70,//"Tomsk"
'76'=> 71,//"Tula"
'77'=> 69,//"Tver'"
'78'=> 72,//"Tyumen'"
'79'=> 17,//"Tuva"
'80'=> 18,//"Udmurt"
'81'=> 73,//"Ul'yanovsk"
'82'=> 85,//"Ust-Orda Buryat"
'83'=> 33,//"Vladimir"
'84'=> 34,//"Volgograd"
'85'=> 35,//"Vologda"
'86'=> 36,//"Voronezh"
'87'=> 89,//"Yamal-Nenets"
'88'=> 76,//"Yaroslavl'"
'89'=> 79,//"Yevrey"
'90'=> 59,//"Permskiy Kray"
'91'=> 24,//"Krasnoyarskiy Kray"
    ); 
            //Region
     /* public  $w = array(
             => array('category' => 3 , 'region' =>73),
            'Ростовская область' => array('category' => 4),
            'Волгоградская область' => array('category' => 5),
            'Алтайский край' => array('category' => 6),
            'Республика Татарстан' => array('category' => 7, 'region' =>16),
        );*/
    protected $listRegion;

    /**
     * Current region
     *
     * @var   integer
     * @see   ____var_see____
     * @since 1.0.0
     */
    protected $currentRegion;

    /**
     * Post category of region
     *
     * @var   integer
     * @see   ____var_see____
     * @since 1.0.0
     */
    protected $currentRegionCategory;

    /**
     * Name of current region
     *
     * @var   string
     * @see   ____var_see____
     * @since 1.0.0
     */
    protected $currentRegionName;

    /**
     * Current country
     *
     * @var   array
     * @see   ____var_see____
     * @since 1.0.0
     */
    protected $currentCountry;



    public function __construct()
    {
        $this->listRegion = ay()->config()->listRegion;
        if (!$this->getRegionBySubdomain()) {
            $this->getRegionByIp();
        }
    }

    /**
     * Возвращает текущий регион пользователя
     *
     * @param string $userId id user
     *
     * @return string название региона
     * @see    ____func_see____
     * @since  1.0.0
     */

    public function getRegion($userId = false) {
        return $this->currentRegion;
    }

    /**
     * Устанавливает текущий регион
     *
     * @param string $userId id user
     *
     * @return void
     * @see    ____func_see____
     * @since  1.0.0
     */
    public function setRegion($id) {
        $this->currentRegionName =$this->listRegion[$id]['name'];
        $this->currentRegionCategory = $this->listRegion[$id]['category'];
        $this->currentRegion = $id;
        $_SESSION['currentRegion'] = $this->currentRegion;
    }

    /**
     * Возвращает текущий регион пользователя
     *
     * @param string $userId id user
     *
     * @return string название региона
     * @see    ____func_see____
     * @since  1.0.0
     */

    public function getRegionName() {
        return $this->currentRegionName;
    }

    /**
     * Устанавливает текущий регион
     *
     * @param string $regionName region name
     *
     * @return void
     * @see    ____func_see____
     * @since  1.0.0
     */
    protected function setRegionName($regionName) {
        $this->setRegion($this->getRegionByName($regionName));
    }


    // Берет из базы id категории региона
    public function getCatRegFromDb($user_id = false) {
        global $wpdb, $current_user;
        if(!$user_id)
            $user_id = $current_user->ID;
        $table_name = $wpdb->prefix . ay()->config()->regDbName;

        $data = $wpdb->get_var('SELECT reg_id FROM ' . $table_name . ' WHERE user_id = ' . $user_id);
        return $data;
    }
    // Записываем в базу, если запись существует обновляем
    public function writeReg($user_id, $reg_id = false) {
        global $wpdb;
        $tableName = $wpdb->prefix . ay()->config()->regDbName;

        $isExist = $this->getCatRegFromDb($user_id);
        if(!$reg_id)
            $reg_id = $this->getCatByReg();

        if(isset($isExist)){
            $wpdb->update(
                $tableName, // Table
                array("reg_id" => $reg_id), // Array of key(col) => val(value to update to)
                array("user_id" => $user_id) // Where
            );
        } else {
            $wpdb->insert(
                $tableName,
                array('user_id' => $user_id,
                      'reg_id' => $reg_id)
            );
        }
    }

    // Получаем описание региона по IP
    public function getRegionByIp($ip = null) {
        if (!(isset($this->currentRegion))){
            $this->currentRegion = isset($_SESSION['currentRegion']) ? $_SESSION['currentRegion'] : null;
            //$ip="67.222.47.114"; //Unknown
            //$ip = "178.217.152.1"; // Республика Адыгея
            //$ip = "109.187.0.1"; // Республика Башкортостан
            //$ip = "176.209.0.1"; // Республика Бурятия
            //$ip = "109.172.56.0"; // Республика Дагестан
            //$ip = "212.94.0.1"; // Республика Ингушетия
            //$ip = "109.106.207.1"; // Республика Кабардино-Балкария
            //$ip = "109.106.216.1"; // Республика Калмыкия
            //$ip = "109.106.215.1"; // Республика Карачаево-Черкессия
            //$ip = "109.124.119.40"; // Республика Карелия
            //$ip = "178.65.0.1"; // Республика Коми
            //$ip = "109.95.120.1"; // Республика Марий-Эл
            //$ip = "178.45.0.1"; // Республика Мордовия
            //$ip = "109.197.200.1"; // Республика Саха (Якутия)
            //$ip = "109.205.144.1"; // Республика Северная Осетия (Алания)
            //$ip = "91.217.156.1"; // Республика Татарстан
            //$ip = "195.42.154.1"; // Республика Тыва (Тува)
            //$ip = "178.157.160.1"; // Республика Удмуртия
            //$ip = "176.208.128.1"; // Республика Хакасия
            //$ip = "188.0.160.1"; // Республика Чечня
            //$ip = "109.195.240.1"; // Республика Чувашия
            //$ip = "176.211.0.1"; // Алтайский край
            //$ip = "188.128.112.161"; // Краснодарский край
            //$ip = "188.128.118.17"; // Красноярский край
            //$ip = "188.128.100.121"; // Приморский край
            //$ip = "109.106.211.1"; // Ставропольский край
            //$ip = "188.128.100.149"; // Хабаровский край
            //$ip = "159.255.0.1"; // Амурская область
            //$ip = "109.205.247.1"; // Архангельская область
            //$ip = "109.106.206.1"; // Астраханская область
            //$ip = "109.62.128.1"; // Белгородская область
            //$ip = "109.194.10.1"; // Брянская область
            //$ip = "109.126.192.1"; // Владимирская область
            //$ip = "188.128.11.85"; // Волгоградская область
            //$ip = "109.124.69.4"; // Вологодская область
            //$ip = "188.128.66.49"; // Воронежская область
            //$ip = "109.108.32.1"; // Ивановская область
            //$ip = "109.163.216.1"; // Иркутская область
            //$ip = "188.128.108.225"; // Калининградская область
            //$ip = "109.225.37.255"; // Калужская область
            //$ip = "193.9.22.1"; // Камчатский край
            //$ip = "109.171.0.1"; // Кемеровская область
            //$ip = "188.128.114.209"; // Кировская область
            //$ip = "109.161.0.1"; // Костромская область
            //$ip = "109.195.128.1"; // Курганская область
            //$ip = "109.127.128.1"; // Курская область
            //$ip = "188.128.101.125"; // Санкт-Петербург
            //$ip = "188.128.46.255"; // Ленинградская область
            //$ip = "109.172.32.1"; // Липецкая область
            //$ip = "109.236.224.1"; // Магаданская область
            //$ip = "109.238.80.1"; // Московская область
            //$ip = "109.124.97.1"; // Мурманская область
            //$ip = "188.128.115.104"; // Нижегородская область
            //$ip = "109.124.104.1"; // Новгородская область
            //$ip = "176.211.128.1"; // Новосибирская область
            // $ip = "195.239.97.129"; // Омская область
            // $ip = "176.28.67.255"; // Оренбургская область
            //$ip = "109.61.128.1"; // Орловская область
            //$ip = "195.16.107.255"; // Пензенская область
            //$ip = "194.220.248.1"; // Пермский край
            //$ip = "195.133.101.1"; // Псковская область
            //$ip = "109.165.7.255"; // Ростовская область
            //$ip = "109.195.160.1"; // Рязанская область
            //$ip = "77.247.141.1"; // Самарская область
            //$ip = "194.220.116.0"; // Саратовская область
            //$ip = "176.15.20.0"; // Сахалинская область
            //$ip = "213.159.192.1"; // Свердловская область
            //$ip = "109.244.126.1";// Смоленская область
            //$ip = "178.75.64.1"; // Тамбовская область
            //$ip = "109.172.96.1"; // Тверская область
            //$ip = "194.186.11.1"; // Томская область
            //$ip = "109.111.0.1"; // Тульская область
            //$ip = "80.79.180.209"; // Тюменская область
            //$ip = "109.197.192.1"; // Ульяновская область
            //$ip = "91.220.33.1"; // Челябинская область
            //$ip = "176.209.128.1"; // Забайкальский край
            //$ip = "212.233.65.1"; // Ярославская область
           // $ip = "78.109.16.152"; // Москва
            //$ip = "195.239.82.1"; // Еврейская автономная область
            //$ip = "194.186.22.1"; // Ненецкий автономный округ
            //$ip = "178.46.176.1"; // Ханты-Мансийский автономный округ
            //$ip = "109.197.144.1"; // Чукотский автономный округ
            if ((isset($this->currentRegion))) {
                $this->setRegion($this->currentRegion);
            }else{
                $ip = $ip ? $ip : $_SERVER['REMOTE_ADDR'];
                $region = geoip_record_by_name($ip);
                if (isset($region['country_code']) && ($region['country_code']=='RU') && isset($region['region'])){
                    if (isset($this->fips[$region['region']])) {
                        $this->setRegion($this->fips[$region['region']]);
                    }
                }
            }
                /*$data = file_get_contents('http://ipgeobase.ru:7020/geo?ip=' . $ip);
                $xml = simplexml_load_string($data);
                if (isset($xml->ip->country) && ($xml->ip->country == 'RU')) {
                    //$this->currentCountry = (string) $xml->ip->country;
                    $this->setRegionName((string) $xml->ip->region);
                } else {
                    //$this->currentCountry = (string) $xml->ip->country;
                    $this->setRegionName((string) $xml->ip->region);
                }
            }*/
        }
    //$this->setRegion($this->currentRegion);
    }
    /**
     * Устанавливаем все всойства по субдомену
     *
     * @param string $regionName region name
     *
     * @return integer
     * @see    ____func_see____
     * @since  1.0.0
     */
    public function getRegionBySubdomain() {
        $host = $_SERVER['HTTP_HOST'];
        $subdomains = explode('.', $host);
        $count = count($subdomains);
        if ($count >2) {
            $subdomain = $subdomains[$count-3];
            if (array_key_exists((int)$subdomain, $this->listRegion)) {
                $this->setRegion($subdomain);
                return true;
            }
        }
    }

    /**
     * Получаем id категории по id региона
     *
     * @param string $regionName region name
     *
     * @return integer
     * @see    ____func_see____
     * @since  1.0.0
     */
    public function getCategoryByRegion($region=false) {
        if ($region) {
            $category = isset($this->listRegion[$region])
                            ? $this->listRegion[$region]['category']
                            : false;
        } else {
            $category = $this->currentRegionCategory ? $this->currentRegionCategory : false;
        }
        return $category;
    }

    /**
     * Получаем id региона по категории
     *
     * @param string $regionName region name
     *
     * @return integer
     * @see    ____func_see____
     * @since  1.0.0
     */
    public function getRegionByCategory($id){
        foreach($this->listRegion as $key=>$value){
            if($value['category'] == $id)
                return $key;
        }
        return false;
    }

    /**
     * Получаем id региона по имени региона
     *
     * @param string $regionName region name
     *
     * @return integer
     * @see    ____func_see____
     * @since  1.0.0
     */

     public function getRegionByName($name = false){
        $name = $name ? $name : $this->currentRegionName;
        foreach($this->listRegion as $key=>$value){
            if($value['name'] == $name)
                return $key;
        }
        return false;
    }
}
